<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="vGx0a" id="vGx0a"><span data-lake-id="u79413d01" id="u79413d01">典型回答</span></h1>
  <p data-lake-id="u7b21c30f" id="u7b21c30f"><br></p>
  <p data-lake-id="u5e5f6b20" id="u5e5f6b20"><span data-lake-id="u24e570b2" id="u24e570b2">在Java中，对于字符串使用==比较的是字符串对象的引用地址是否相同。</span></p>
  <p data-lake-id="u4290f569" id="u4290f569"><span data-lake-id="u8cc665cf" id="u8cc665cf">​</span><br></p>
  <p data-lake-id="u4f216a0d" id="u4f216a0d"><span data-lake-id="ud294c248" id="ud294c248">因为a和b都是由字面量组成的字符串，它们的引用地址在编译时就已经确定了，并且在编译之后，会把字面量直接合在一起。因此，a == b的结果为true，因为它们指向的是同一个字符串对象。</span></p>
  <p data-lake-id="uafc3b276" id="uafc3b276"><span data-lake-id="u85448cb9" id="u85448cb9">​</span><br></p>
  <p data-lake-id="ud79d0eb7" id="ud79d0eb7"><br></p>
  <h1 data-lake-id="b4cG4" id="b4cG4"><span data-lake-id="ua8ed42ed" id="ua8ed42ed">扩展知识</span></h1>
  <p data-lake-id="u9a7895b3" id="u9a7895b3"><br></p>
  <h2 data-lake-id="AfDwW" id="AfDwW"><span data-lake-id="ub32630a5" id="ub32630a5">字面量</span></h2>
  <p data-lake-id="u6f9e8e94" id="u6f9e8e94"><br></p>
  <p data-lake-id="u6e5b5d20" id="u6e5b5d20"><span data-lake-id="u80d2c677" id="u80d2c677">在计算机科学中，字面量（literal）是用于表达源代码中一个固定值的表示法（notation）。几乎所有计算机编程语言都具有对基本值的字面量表示，诸如：整数、浮点数以及字符串；而有很多也对布尔类型和字符类型的值也支持字面量表示；还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。</span></p>
  <p data-lake-id="u06430af3" id="u06430af3"><span data-lake-id="ubba74235" id="ubba74235">​</span><br></p>
  <p data-lake-id="ue885441a" id="ue885441a"><span data-lake-id="u2ef9ef19" id="u2ef9ef19">以上是关于计算机科学中关于字面量的解释，并不是很容易理解。说简单点，字面量就是指由字母、数字等构成的字符串或者数值。</span></p>
  <p data-lake-id="u72d37922" id="u72d37922"><span data-lake-id="u7071745b" id="u7071745b">​</span><br></p>
  <p data-lake-id="ua3a6922d" id="ua3a6922d"><span data-lake-id="u07d43d68" id="u07d43d68">字面量只可以右值出现，所谓右值是指等号右边的值，如：int a=123这里的a为左值，123为右值。在这个例子中123就是字面量。</span></p>
  <p data-lake-id="u17df20e4" id="u17df20e4"><span data-lake-id="u61f13e56" id="u61f13e56">​</span><br></p>
  <pre lang="java"><code>
int a = 123;
String s = "hollis";
</code></pre>
  <p data-lake-id="u66236947" id="u66236947"><br></p>
  <p data-lake-id="uca5a4e29" id="uca5a4e29" style="text-align: justify"><span data-lake-id="u0282ef00" id="u0282ef00" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">上面的代码事例中，123和hollis都是字面量。</span></p>
  <p data-lake-id="ued65d20e" id="ued65d20e"><span data-lake-id="u2dd26ddb" id="u2dd26ddb" class="lake-fontsize-12">​</span><br></p>
  <p data-lake-id="u3f41329e" id="u3f41329e"><span data-lake-id="ue2b03c0c" id="ue2b03c0c">JVM为了提高性能和减少内存开销，在实例化字符串常量的时候进行了一些优化。为了减少在JVM中创建的字符串的数量，字符串类维护了一个字符串常量池。</span></p>
  <p data-lake-id="u16919e6b" id="u16919e6b"><span data-lake-id="u9f5c7772" id="u9f5c7772">​</span><br></p>
  <p data-lake-id="u0346009d" id="u0346009d"><span data-lake-id="u9f78a35f" id="u9f78a35f">在JVM中，有一块区域是运行时常量池，主要用来存储编译期生成的各种</span><strong><span data-lake-id="uaf992bc1" id="uaf992bc1">字面量</span></strong><span data-lake-id="ua91e0ff4" id="ua91e0ff4">和</span><strong><span data-lake-id="u8e411723" id="u8e411723">符号引用</span></strong><span data-lake-id="u9d131c8f" id="u9d131c8f">。</span></p>
  <p data-lake-id="u2126040a" id="u2126040a"><span data-lake-id="ud1883439" id="ud1883439">​</span><br></p>
  <p data-lake-id="u890bdc80" id="u890bdc80"><span data-lake-id="u7da76dca" id="u7da76dca">​</span><br></p>
  <p data-lake-id="u36d71f62" id="u36d71f62"><span data-lake-id="u51d3a896" id="u51d3a896">了解Class文件结构或者做过Java代码的</span><span data-lake-id="u22644682" id="u22644682">反编译</span><span data-lake-id="u47ae6d66" id="u47ae6d66">的朋友可能都知道，在java代码被javac编译之后，文件结构中是包含一部分Constant pool的。比如以下代码：</span></p>
  <p data-lake-id="ueb9b523e" id="ueb9b523e"><span data-lake-id="uc557002f" id="uc557002f">​</span><br></p>
  <pre lang="java"><code>
public static void main(String[] args) {
    String s = "Hollis";
}
</code></pre>
  <p data-lake-id="uf2bf4d1c" id="uf2bf4d1c"><br></p>
  <p data-lake-id="u057159f1" id="u057159f1"><span data-lake-id="u28aabe23" id="u28aabe23" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">经过编译后，常量池内容如下：</span></p>
  <p data-lake-id="u2c2325bf" id="u2c2325bf"><span data-lake-id="u85807f5d" id="u85807f5d" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <pre lang="java"><code>
 Constant pool:
   #1 = Methodref          #4.#20         // java/lang/Object."&lt;init&gt;":()V
   #2 = String             #21            // Hollis
   #3 = Class              #22            // StringDemo
   #4 = Class              #23            // java/lang/Object
   ...
   #16 = Utf8               s
   ..
   #21 = Utf8               Hollis
   #22 = Utf8               StringDemo
   #23 = Utf8               java/lang/Object
</code></pre>
  <p data-lake-id="u5c44f1c6" id="u5c44f1c6"><br></p>
  <p data-lake-id="ucbcbdc36" id="ucbcbdc36"><span data-lake-id="u4d2e745d" id="u4d2e745d" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">上面的Class文件中的常量池中，比较重要的几个内容：</span></p>
  <p data-lake-id="u30c15082" id="u30c15082"><span data-lake-id="udab3f56e" id="udab3f56e" class="lake-fontsize-12" style="color: rgb(51, 51, 51)">​</span><br></p>
  <pre lang="java"><code>
   #16 = Utf8               s
   #21 = Utf8               Hollis
   #22 = Utf8               StringDemo
</code></pre>
  <p data-lake-id="ufb582b89" id="ufb582b89"><br></p>
  <p data-lake-id="ud0013ae2" id="ud0013ae2"><span data-lake-id="u47404187" id="u47404187">上面几个常量中，</span><code data-lake-id="ua4ea2996" id="ua4ea2996"><span data-lake-id="u3c1c44cb" id="u3c1c44cb">s</span></code><span data-lake-id="ud50dd959" id="ud50dd959">就是前面提到的符号引用，而</span><code data-lake-id="u1211a183" id="u1211a183"><span data-lake-id="uaf1386d1" id="uaf1386d1">Hollis</span></code><span data-lake-id="ud25b549d" id="ud25b549d">就是前面提到的</span><strong><span data-lake-id="ubd4b10a2" id="ubd4b10a2">字面量</span></strong><span data-lake-id="u2ad8cbbd" id="u2ad8cbbd">。</span></p>
  <p data-lake-id="u82d77b61" id="u82d77b61"><span data-lake-id="ud2a0cf7e" id="ud2a0cf7e">​</span><br></p>
  <p data-lake-id="u9e1d6520" id="u9e1d6520"><span data-lake-id="ubd3aab2a" id="ubd3aab2a">而Class文件中的常量池部分的内容，会在运行期被运行时常量池加载进去。</span></p>
  <p data-lake-id="u33f475b2" id="u33f475b2"><span data-lake-id="u643a2212" id="u643a2212">​</span><br></p>
  <p data-lake-id="u074abdc4" id="u074abdc4"><span data-lake-id="u82265fa8" id="u82265fa8">​</span><br></p>
 </body>
</html>